large_us_stocks = {
"VTI": 0.8,
"VNQ (REIT)": 0.2
}
large_exus_stocks = {
"EAFE": 1
}
small_us_stocks = {
"Russell 2000": 1
}
small_exus_stocks = {
"EAFE Small-Cap": 1
}
bonds = {
"BND": 1
}
fund_shares = [large_us_stocks, large_exus_stocks, small_us_stocks, small_exus_stocks, bonds]
from src.domain import *
from src.distribution import create_distributions_from
from src.display.distribution import display_distributions
default_distribution = SharesDistribution(
by_type=dict(zip((ShareType.Stock, ShareType.Bond), (0.75, 0.25))),
by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
by_cap=dict(zip((Cap.Large, Cap.Small), (0.7, 0.3))),
by_term=dict(zip((Term.Long, ), (1, ))),
)
def modify_distrib_by_type_ratio(distrib: SharesDistribution, stock_rate: float):
bond_rate = 1 - stock_rate
distrib.by_type[ShareType.Stock] = stock_rate
distrib.by_type[ShareType.Bond] = bond_rate
distributions_rates = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
distributions_names = [f'{round(x * 100)}/{round((1 - x) * 100)}' for x in distributions_rates]
distributions = create_distributions_from(default_distribution, modify_distrib_by_type_ratio, distributions_rates)
display_distributions(distributions, names=distributions_names, funds=fund_shares)
| 0/100 | 10/90 | 20/80 | 30/70 | 40/60 | 50/50 | 60/40 | 70/30 | 80/20 | 90/10 | 100/0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| VTI | 0.0% | 3.92% | 7.84% | 11.76% | 15.68% | 19.6% | 23.52% | 27.44% | 31.36% | 35.28% | 39.2% |
| VNQ (REIT) | 0.0% | 0.98% | 1.96% | 2.94% | 3.92% | 4.9% | 5.88% | 6.86% | 7.84% | 8.82% | 9.8% |
| EAFE | 0.0% | 2.1% | 4.2% | 6.3% | 8.4% | 10.5% | 12.6% | 14.7% | 16.8% | 18.9% | 21.0% |
| Russell 2000 | 0.0% | 2.1% | 4.2% | 6.3% | 8.4% | 10.5% | 12.6% | 14.7% | 16.8% | 18.9% | 21.0% |
| EAFE Small-Cap | 0.0% | 0.9% | 1.8% | 2.7% | 3.6% | 4.5% | 5.4% | 6.3% | 7.2% | 8.1% | 9.0% |
| BND | 100% | 90.0% | 80.0% | 70.0% | 60.0% | 50.0% | 40.0% | 30.0% | 20.0% | 10.0% | 0% |
| Mean ret. | Std | |
|---|---|---|
| 0/100 | 5.12 | 3.69 |
| 10/90 | 5.66 | 3.71 |
| 20/80 | 6.17 | 4.31 |
| 30/70 | 6.67 | 5.28 |
| 40/60 | 7.14 | 6.46 |
| 50/50 | 7.60 | 7.76 |
| 60/40 | 8.02 | 9.12 |
| 70/30 | 8.43 | 10.53 |
| 80/20 | 8.81 | 11.96 |
| 90/10 | 9.16 | 13.41 |
| 100/0 | 9.49 | 14.87 |
from src.domain import *
from src.distribution import create_distributions_from
from src.display.distribution import display_distributions
default_distribution = SharesDistribution(
by_type=dict(zip((ShareType.Stock, ShareType.Bond), (1, 0))),
by_region=dict(zip((Region.US, Region.ExUS), (0.7, 0.3))),
by_cap=dict(zip((Cap.Large, Cap.Small), (0.7, 0.3))),
by_term=dict(zip((Term.Long, ), (1, ))),
)
def modify_distrib_by_cap_ratio(distrib: SharesDistribution, large_cap: float):
small_cap = 1 - large_cap
distrib.by_cap[Cap.Large] = large_cap
distrib.by_cap[Cap.Small] = small_cap
distributions_rates = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
distributions_names = [f'{round(x * 100)}/{round((1 - x) * 100)}' for x in distributions_rates]
distributions = create_distributions_from(default_distribution, modify_distrib_by_cap_ratio, distributions_rates)
display_distributions(distributions, names=distributions_names, funds=fund_shares)
| 0/100 | 10/90 | 20/80 | 30/70 | 40/60 | 50/50 | 60/40 | 70/30 | 80/20 | 90/10 | 100/0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| VTI | 0.0% | 5.6% | 11.2% | 16.8% | 22.4% | 28.0% | 33.6% | 39.2% | 44.8% | 50.4% | 56.0% |
| VNQ (REIT) | 0.0% | 1.4% | 2.8% | 4.2% | 5.6% | 7.0% | 8.4% | 9.8% | 11.2% | 12.6% | 14.0% |
| EAFE | 0.0% | 3.0% | 6.0% | 9.0% | 12.0% | 15.0% | 18.0% | 21.0% | 24.0% | 27.0% | 30.0% |
| Russell 2000 | 70.0% | 63.0% | 56.0% | 49.0% | 42.0% | 35.0% | 28.0% | 21.0% | 14.0% | 7.0% | 0.0% |
| EAFE Small-Cap | 30.0% | 27.0% | 24.0% | 21.0% | 18.0% | 15.0% | 12.0% | 9.0% | 6.0% | 3.0% | 0.0% |
| BND | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% | 0% |
| Mean ret. | Std | |
|---|---|---|
| 0/100 | 9.81 | 17.21 |
| 10/90 | 9.78 | 16.81 |
| 20/80 | 9.75 | 16.42 |
| 30/70 | 9.71 | 16.06 |
| 40/60 | 9.66 | 15.72 |
| 50/50 | 9.61 | 15.41 |
| 60/40 | 9.55 | 15.13 |
| 70/30 | 9.49 | 14.87 |
| 80/20 | 9.42 | 14.65 |
| 90/10 | 9.35 | 14.45 |
| 100/0 | 9.27 | 14.30 |